﻿#ifndef CDBTABLEDATAINFO_H
#define CDBTABLEDATAINFO_H

#include <QMap>
#include <QVector>
#include <QString>
#include <QSqlRecord>

/***********************************************
* [className]   CDbTableDataInfo
* [func]        数据库语句自动转换，兼容多数据库使用
* [author]      jhb
* [date]        2023-12-14 08:54
* [Modification Log]
* Version               By              Notes
* v0.0.1                jhb             初次建立
************************************************/
class CDbTableDataInfo
{
public:
    virtual ~CDbTableDataInfo(){}
    /***************************************************************
    * @datatime 2023-12-15 09:52:27
    * @author   jhb
    * @brief    设置工作类型
    * @input    const int &nWorkType        工作类型
    * @output   无
    * @return   无
    * @note
    ****************************************************************/
    virtual void setWorkType(const int &nWorkType) = 0;

    /***************************************************************
    * @datatime 2023-12-15 13:15:42
    * @author   jhb
    * @brief    设置事务ID
    * @input    const QString &sTransactionID       事务ID
    * @output   无
    * @return   无
    * @note
    ****************************************************************/
    virtual void setTransactionID(const QString &sTransactionID) = 0;

    /***************************************************************
    * @datatime 2023-12-13 16:29:44
    * @author   jhb
    * @brief    添加条件（where后面的条件）
    * @input    const QString &sFilter                  条件（格式"filter1=;filter2>")
    * @output   无
    * @return   无
    * @note
    ****************************************************************/
    virtual void addFilterName(const QString &sFilter) = 0;

    /***************************************************************
    * @datatime 2023-12-13 16:32:05
    * @author   jhb
    * @brief    添加条件（where后面的条件）
    * @input    const QVector<QString> &vecFilter       条件
    * @output   无
    * @return   无
    * @note
    ****************************************************************/
    virtual void addFilterName(const QVector<QString> &vecFilter) = 0;

    /***************************************************************
    * @datatime 2023-12-15 11:04:43
    * @author   jhb
    * @brief    添加条件值
    * @input    const QString &sValue                   条件值
    * @output   无
    * @return   无
    * @note
    ****************************************************************/
    virtual void addFilterValue(const QString &sValue) = 0;

    /***************************************************************
    * @datatime 2023-12-13 16:33:44
    * @author   jhb
    * @brief    添加条件值
    * @input    const QVector<QString> &vecValue        条件值
    * @output   无
    * @return   无
    * @note
    ****************************************************************/
    virtual void addFilterValue(const QVector<QString> &vecValue) = 0;

    /***************************************************************
    * @datatime 2023-12-13 16:37:30
    * @author   jhb
    * @brief    添加字段名
    * @input    const QString &sResult                  字段（格式"Field1=;Field2>")
    * @output   无
    * @return   无
    * @note
    ****************************************************************/
    virtual void addResultField(const QString &sField) = 0;

    /***************************************************************
    * @datatime 2023-12-13 16:42:52
    * @author   jhb
    * @brief    添加字段名
    * @input    const QVector<QString> &vecField        字段
    * @output   无
    * @return   无
    * @note
    ****************************************************************/
    virtual void addResultField(const QVector<QString> &vecField) = 0;

    /***************************************************************
    * @datatime 2023-12-13 16:42:52
    * @author   jhb
    * @brief    添加字段名
    * @input    const QVector<QVariant> &vecField        字段
    * @output   无
    * @return   无
    * @note
    ****************************************************************/
    virtual void addResultField(const QVector<QVariant> &vecField) = 0;

    /***************************************************************
    * @datatime 2023-12-15 11:06:53
    * @author   jhb
    * @brief    添加字段值
    * @input    const QString &sValue        字段值
    * @output   无
    * @return   无
    * @note
    ****************************************************************/
    virtual void addResultValue(const QString &sValue) = 0;

    /***************************************************************
    * @datatime 2023-12-13 16:44:10
    * @author   jhb
    * @brief    添加字段值
    * @input    const QVector<QString> &vecValue        字段值
    * @output   无
    * @return   无
    * @note
    ****************************************************************/
    virtual void addResultValue(const QVector<QString> &vecValue) = 0;

    /***************************************************************
    * @datatime 2023-12-13 16:44:10
    * @author   jhb
    * @brief    添加字段值
    * @input    const QVector<QVariant> &vecValue        字段值
    * @output   无
    * @return   无
    * @note
    ****************************************************************/
    virtual void addResultValue(const QVector<QVariant> &vecValue) = 0;

    /***************************************************************
    * @datatime 2023-12-13 17:02:59
    * @author   jhb
    * @brief    添加排序字段
    * @input    const QString &sField                   字段（格式"Field1=;Field2>")
    * @output   无
    * @return   无
    * @note
    ****************************************************************/
    virtual void addOrderByField(const QString &sField) = 0;

    /***************************************************************
    * @datatime 2023-12-13 17:05:14
    * @author   jhb
    * @brief    添加排序字段
    * @input    const QVector<QString> &vecField        字段
    * @output   无
    * @return   无
    * @note
    ****************************************************************/
    virtual void addOrderByField(const QVector<QString> &vecField) = 0;

    /***************************************************************
    * @datatime 2023-12-13 17:06:30
    * @author   jhb
    * @brief    添加排序规则
    * @input    const QString &sRule                    排序规则（格式"rule1;rule2"）
    * @output   无
    * @return   无
    * @note
    ****************************************************************/
    virtual void addOrderByRule(const QString &sRule) = 0;

    /***************************************************************
    * @datatime 2023-12-13 17:10:49
    * @author   jhb
    * @brief    添加排序规则
    * @input    const QVector<QString> &vecRule         排序规则
    * @output   无
    * @return   无
    * @note
    ****************************************************************/
    virtual void addOrderByRule(const QVector<QString> &vecRule) = 0;

    /***************************************************************
    * @datatime 2023-12-14 08:45:14
    * @author   jhb
    * @brief    添加条件间连接符
    * @input    const QMap<int, QString> &mapSymbol         条件间连接符
    * @output   无
    * @return   无
    * @note
    ****************************************************************/
    virtual void addSymbol(const QMap<int, QString> &mapSymbol) = 0;

    /***************************************************************
    * @datatime 2023-12-14 08:47:34
    * @author   jhb
    * @brief    添加条件间连接符
    * @input    const int &nIndex           条件索引（在哪个条件前面，既为哪个序号，序号自0开始）
    *           const QString &symbol       连接符号
    * @output   无
    * @return   无
    * @note
    ****************************************************************/
    virtual void addSymbol(const int &nIndex, const QString &symbol) = 0;

    /***************************************************************
    * @datatime 2023-12-14 08:50:37
    * @author   jhb
    * @brief    添加筛选
    * @input    const int &nLimit           筛选数量
    * @output   无
    * @return   无
    * @note
    ****************************************************************/
    virtual void addLimit(const int &nLimit) = 0;

    /***************************************************************
    * @datatime 2023-12-14 08:51:43
    * @author   jhb
    * @brief    添加自定义SQL
    * @input    const QString &sSql         自定义SQL（默认规则为Mysql）
    * @output   无
    * @return   无
    * @note
    ****************************************************************/
    virtual void addSql(const QString &sSql) = 0;

    /***************************************************************
    * @datatime 2024-02-19 08:47
    * @author   jhb
    * @brief    添加自定义SQL
    * @input    const QString &sSql             自定义SQL（默认规则为Mysql）
    *           const QMap<QString, QVariant> &mapBindValue    需要绑定（bindvalue）的数据
    * @output   无
    * @return   无
    * @note
    ****************************************************************/
    virtual void addSql(const QString &sSql, const QMap<QString, QVariant> &mapBindValue) = 0;

    /***************************************************************
    * @datatime 2024-02-18 16:35
    * @author   jhb
    * @brief    添加绑定数据
    * @input    const QMap<QString, QVariant> &mapBindValue    添加SQL后，需要绑定的数据
    * @output   无
    * @return   无
    * @note
    ****************************************************************/
    virtual void addBindValue(const QMap<QString, QVariant> &mapBindValue) = 0;

    /***************************************************************
    * @datatime 2023-12-15 11:31:58
    * @author   jhb
    * @brief    获取查询结果
    * @input    无
    * @output   无
    * @return   QVector<QSqlRecord>         查询结果集
    * @note
    ****************************************************************/
    virtual QVector<QSqlRecord> getReRecord() = 0;

    /***************************************************************
    * @datatime 2023-12-14 08:57:58
    * @author   jhb
    * @brief    数据资源上锁
    * @input    无
    * @output   无
    * @return   true:锁定成功
    *           false:锁定失败
    * @note
    ****************************************************************/
    virtual bool tryLock(int nTime=0) = 0;

    /***************************************************************
    * @datatime 2023-12-14 08:57:10
    * @author   jhb
    * @brief    数据资源解锁
    * @input    无
    * @output   无
    * @return   无
    * @note
    ****************************************************************/
    virtual void unlock() = 0;

    /***************************************************************
    * @datatime 2023-12-15 11:19:25
    * @author   jhb
    * @brief    获取最后执行的SQL
    * @input    无
    * @output   无
    * @return   QString             数据库语句
    * @note
    ****************************************************************/
    virtual QString getLastSql() = 0;

    /***************************************************************
    * @datatime 2023-12-15 11:18:15
    * @author   jhb
    * @brief    获取错误信息
    * @input    无
    * @output   无
    * @return   QString         错误信息
    * @note
    ****************************************************************/
    virtual QString getLastError() = 0;

    /***************************************************************
    * @datatime 2024-03-07 15:40
    * @author   jhb
    * @brief    获取sql类型
    * @input    无
    * @output   无
    * @return   无
    * @note
    ****************************************************************/
    virtual int getSqlType() = 0;
};

#endif // CDBTABLEDATAINFO_H
